﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPNETVN.PORTAL.Components.UI;
using System.IO;
using ASPNETVN.PORTAL.Components.Share;
using CDTM.Modules.TraCuuDiem.Components;
using System.Collections;
using System.Data;
using ASPNETVN.PORTAL.Components.Security;

namespace CDTM.Modules.TraCuuDiem.Controls
{
    public partial class AddEditDiemTuyenSinh : AddEditItemControl
    {
        protected override void OnInit(EventArgs e)
        {
            this.Update += new EventHandler(AddEditStudent_Update);
            this.Delete += new EventHandler(AddEditStudent_Delete);
            base.OnInit(e);

            GetLog();
        }

        void AddEditStudent_Delete(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        void AddEditStudent_Update(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            lblReadOnly.Visible = false;
            //GetLog();

            if (IsPostBack == false)
            {
                lblMessage.Text = string.Empty;
                //pnlDetails.Visible = false;

                GetLog();
            }
        }

        protected void btnThucThi_Click(object sender, EventArgs e)
        {
            try
            {
                if (!Global.ValidateFile(FileUploadAttachment, lblMessage))
                    return;

                string fileUrl = Global.UploadFile(FileUploadAttachment, lblMessage, "FILE", this.ModuleID.ToString(), true);

                //Upload file thành công.
                if (fileUrl.Length != 0)
                {
                    //Kiểm tra thuộc tính ReadOnly -> Hiển thị thông báo.
                    if (Global.IsReadOnly(Server.MapPath(fileUrl)))
                    {
                        lblReadOnly.Text = "Tệp tin được thiết lập 'ReadOnly/ Chỉ đọc'.";
                        lblReadOnly.Visible = true;
                    }

                    //Lấy tên các Sheet.
                    ArrayList listSheetName = Global.GetSheetNameList(Server.MapPath(fileUrl), lblMessage);
                    if (listSheetName.Count == 0)
                        return;

                    //Kiểm tra file có đúng định dạng file 'Excel' mẫu?.
                    if (!Global.CheckSchema(Server.MapPath(fileUrl), listSheetName[0].ToString(), lblMessage, Global.TraCuuDiemType.DiemTuyenSinh))
                        return;

                    //Lấy dữ liệu từ file Excel.
                    DataTable data = Global.GetDataFromXLS(Server.MapPath(fileUrl), listSheetName[0].ToString());
                    if (data == null)
                    {
                        lblMessage.Text = "Không đọc được dữ liệu từ Sheet '" + listSheetName[0].ToString() + "'";
                        return;
                    }

                    //Đọc dữ liệu từ DataTable -> trả về Collection object Tuyen sinh                
                    List<TuyenSinh> collection = new List<TuyenSinh>();
                    List<LogDetail> logDetails = new List<LogDetail>();

                    try
                    {

                        collection = Global.ExcelSheetReadTuyenSinh(data, Global.TUYENSINH_ROW_POSITION_GETVALUE, out logDetails);

                        if (collection.Count == 0)
                        {
                            lblMessage.Text = "Không có bản ghi nào hoặc tệp 'Excel' không đúng mẫu quy định. Hãy kiểm tra lại!.";
                            return;
                        }
                    }
                    catch
                    {
                        lblMessage.Text = "Lỗi trong quá trình chuyển đổi dữ liệu.";
                    }

                    //Xóa dữ liệu rác
                    collection = TuyenSinh.Clean(collection);

                    //Xóa tất cả dữ liệu cũ trước khi nhập khẩu.
                    TuyenSinh.DeleteAll();

                    //Ghi dữ liệu vào Database.   
                    if (TuyenSinh.InsertCollection(collection))
                    {
                        //Ghi lại nhật ký nhập khẩu dữ liệu.
                        Log log = new Log();
                        log.TraCuuDiemType = Global.TraCuuDiemType.DiemTuyenSinh.ToString();
                        log.DateCreated = DateTime.Now;
                        log.UserLogIn = PortalSecurity.CurrentUser.Identity.Email;
                        log.TotalRecords = collection.Count;
                        log.LogType = Global.LogType.Import.ToString();
                        log.FileName = Server.MapPath(fileUrl) + ".\nSố bản ghi lưu = "
                                + collection.Count + ", số bản ghi lỗi = " + logDetails.Count + ".";
                        log.Description = "Nhập khẩu " + Global.TraCuuDiemType.DiemTuyenSinh.ToString();

                        int logID = log.Insert();

                        //Lưu thông tin lỗi trong quá trình đọc dữ liệu từ file Excel.
                        foreach (LogDetail item in logDetails)
                        {
                            item.LogID = logID;
                        }

                        LogDetail.InsertCollection(logDetails);

                        GetLog();

                        lblMessage.Text = "Quá trình nhập khẩu dữ liệu thành công. \nSố bản ghi đã được lưu vào cơ sở dữ liệu: "
                            + collection.Count + ", số bản ghi lỗi: " + logDetails.Count + ". Xem nhật ký để biết thêm chi tiết.";
                    }
                }
            }
            catch (Exception ex)
            {
                lblMessage.Text = "Quá trình nhập khẩu dữ liệu không thành công.";
                //lblMessage.Text += "\n" + ex.Message;
            }
        }

        /// <summary>
        /// Lấy dữ liệu nhật ký.
        /// </summary>
        private void GetLog()
        {
            listLog = Log.SelectCollectionAll()
                .Where(x => x.TraCuuDiemType == Global.TraCuuDiemType.DiemTuyenSinh.ToString())
                .OrderByDescending(obj => obj.DateCreated).ToList();

            repLog.DataSource = listLog;
            repLog.DataBind();
        }

        /*
        private void GetLog()
        {
            DataSet ds = new DataSet();

            DataTable dtLog = new DataTable();
            DataTable dtLogDetail = new DataTable();


            dtLog = Log.SelectDynamic("TraCuuDiemType = '" + Global.TraCuuDiemType.DiemTuyenSinh.ToString() + "'", "DateCreated Desc").Tables[0].Copy();
            dtLogDetail.TableName = "Log";

            //dtLogDetail = LogDetail.SelectAll().Tables[0].Copy();
            //dtLogDetail.TableName = "LogDetail";

            ds.Tables.Add(dtLog);
            //ds.Tables.Add(dtLogDetail);

            //ds.Relations.Add("InnerVal", ds.Tables[0].Columns["LogID"], ds.Tables[1].Columns["LogID"]);

            repLog.DataSource = ds.Tables[0];
            repLog.DataBind();

            /*
            ArrayList itemCollection = new ArrayList();

            foreach (GridViewRow gridRow in repLog.Rows)
            {
                DataRow[] childRows = ds.Tables[0].Rows[gridRow.RowIndex].GetChildRows("InnerVal");


                //Hides parent row if child rows are empty
                if (childRows.Length <= 0)
                {
                    gridRow.Visible = false;
                }
                else
                {
                    GridView innerGrid = gridRow.FindControl("repLogDetails") as GridView;

                    if (innerGrid == null)
                        throw new Exception("Inner Grid Not Found");

                    foreach (DataRow childRow in childRows)
                    {
                        LogDetail myItem = new LogDetail();
                        myItem.LogID = Convert.ToInt32(childRow["LogID"]);
                        itemCollection.Add(myItem);
                    }

                    innerGrid.DataSource = itemCollection;

                    innerGrid.DataBind();

                }

            }
            
        }
        */

        protected void btnCancel_Click(object sender, EventArgs e)
        {
            this.ReturnToReferrerPage();
        }

        #region Log Paging
        public static List<Log> listLog;

        protected void PageDropDownList_SelectedIndexChanged(Object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;
            repLog.PageIndex = ddl.SelectedIndex;
            repLog.DataSource = listLog;
            repLog.DataBind();
        }

        protected void repLog_DataBound(object sender, EventArgs e)
        {
            if (repLog.Rows.Count > 0)
            {
                // Retrieve the pager row.
                GridViewRow bottomPagerRow = repLog.BottomPagerRow;
                GridViewRow topPagerRow = repLog.TopPagerRow;

                // Retrieve the DropDownList and Label controls from the row.
                DropDownList topPageList = (DropDownList)topPagerRow.Cells[0].FindControl("PageDropDownList");
                DropDownList bottomPageList = (DropDownList)bottomPagerRow.Cells[0].FindControl("PageDropDownList");
                Label topPageLabel = (Label)topPagerRow.Cells[0].FindControl("PageLabel");
                Label bottomPageLabel = (Label)bottomPagerRow.Cells[0].FindControl("PageLabel");

                if (topPageList != null && bottomPageList != null)
                {
                    for (int i = 0; i < repLog.PageCount; i++)
                    {
                        int pageNumber = i + 1;
                        ListItem item = new ListItem(pageNumber.ToString());
                        if (i == repLog.PageIndex)
                        {
                            item.Selected = true;
                        }

                        topPageList.Items.Add(item);
                        bottomPageList.Items.Add(item);
                    }
                }

                if (topPageLabel != null && bottomPageLabel != null)
                {
                    topPageLabel.Text = bottomPageLabel.Text = " / " + repLog.PageCount.ToString();
                }
            }
        }

        protected void repLog_PageIndexChanged(object sender, EventArgs e)
        {
            repLog.SelectedIndex = -1;
        }
        #endregion

        #region LogDetails Paging
        public static List<LogDetail> listLogDetails;

        protected void PageDropDownList2_SelectedIndexChanged(Object sender, EventArgs e)
        {
            DropDownList ddl = (DropDownList)sender;
            repLogDetails.PageIndex = ddl.SelectedIndex;
            repLogDetails.DataSource = listLogDetails;
            repLogDetails.DataBind();
        }

        protected void repLogDetails_DataBound(object sender, EventArgs e)
        {
            if (repLogDetails.Rows.Count > 0)
            {
                // Retrieve the pager row.
                GridViewRow bottomPagerRow = repLogDetails.BottomPagerRow;
                GridViewRow topPagerRow = repLogDetails.TopPagerRow;

                // Retrieve the DropDownList and Label controls from the row.
                DropDownList topPageList = (DropDownList)topPagerRow.Cells[0].FindControl("PageDropDownList2");
                DropDownList bottomPageList = (DropDownList)bottomPagerRow.Cells[0].FindControl("PageDropDownList2");
                Label topPageLabel = (Label)topPagerRow.Cells[0].FindControl("PageLabel2");
                Label bottomPageLabel = (Label)bottomPagerRow.Cells[0].FindControl("PageLabel2");

                if (topPageList != null && bottomPageList != null)
                {
                    for (int i = 0; i < repLogDetails.PageCount; i++)
                    {
                        int pageNumber = i + 1;
                        ListItem item = new ListItem(pageNumber.ToString());
                        if (i == repLogDetails.PageIndex)
                        {
                            item.Selected = true;
                        }

                        topPageList.Items.Add(item);
                        bottomPageList.Items.Add(item);
                    }
                }

                if (topPageLabel != null && bottomPageLabel != null)
                {
                    topPageLabel.Text = bottomPageLabel.Text = " / " + repLogDetails.PageCount.ToString();
                }
            }
        }

        protected void repLogDetails_PageIndexChanged(object sender, EventArgs e)
        {
            repLog.SelectedIndex = -1;
        }
        #endregion

        /// <summary>
        /// Xóa nhật ký
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            Log.DeleteLogDynamic("1=1");

            GetLog();
        }

        protected void repLog_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            HiddenField crl = (HiddenField)repLog.Rows[e.NewSelectedIndex].FindControl("hdfLogID");

            if (crl != null)
            {
                int logID = Convert.ToInt32(crl.Value);

                listLogDetails = LogDetail.SelectCollectionDynamic("LogID = " + logID, "");
                repLogDetails.DataSource = listLogDetails;
                repLogDetails.DataBind();
                pnlDetails.Visible = true;
            }
        }

    }

}